/* 
    Queue 受限的线性 
        特点:先进先出
    #前端删除元素,后端添加元素

    ! 生活例子:排队
    打印队列
        - 优先放入的文档,优先被取出
    线程队列
        - 线程队列会依照次序来启动线程,并处理对应的任务
*/

// *基于链表实现比基于数组实现性能高些

// *1.基于数组实现
/* function Queue() {
  this.items = [];

  // 1.将元素加入到队列中
  Queue.prototype.enqueue = function (element) {
    this.items.push(element);
  };
  // 2.从队列中删除前端元素
  Queue.prototype.dequeue = function () {
    return this.items.shift();
  };
  // 3.查看队列前端元素
  Queue.prototype.front = function () {
    return this.items[0];
  };
  // 4.查看队列是否为空
  Queue.prototype.isEmpty = function () {
    return this.items.length === 0;
  };
  // 5.查看队列中元素的个数
  Queue.prototype.size = function () {
    return this.items.length;
  };
  // 6.toString()方法
  Queue.prototype.toString = function () {
    let resultString = '';
    for (let i = 0; i < this.items.length; i++) {
      resultString += this.items[i] + ' ';
    }
    return resultString;
  };
} */

export default class Queue {
  constructor() {
    this.items = [];
  }

  // 1.将元素加入到队列中
  enqueue(element) {
    this.items.push(element);
  }

  // 2.从队列中删除前端元素
  dequeue() {
    return this.items.shift();
  }

  // 3.查看队列前端元素
  front() {
    return this.items[0];
  }

  // 4.查看队列是否为空
  isEmpty() {
    return this.items.length === 0;
  }

  // 5.查看队列中元素的个数
  size() {
    return this.items.length;
  }

  // 6.toString()方法
  toString() {
    let resultString = '';
    for (let item of this.items) {
      resultString += item + ' ';
    }
    return resultString.trim();
  }
}

let queue = new Queue();
queue.enqueue('seele');
queue.enqueue('elysia');
queue.enqueue('kiana');
console.log('查看队列', queue);
console.log('查看队列前端元素', queue.front());
console.log('删除前端元素', queue.dequeue());
console.log('查看队列是否为空', queue.isEmpty());
console.log('查看队列中元素的个数', queue.size());
console.log('toString()方法', queue.toString());
